﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using Fatec.ControleEstoque.Attributes;
using Fatec.ControleEstoque.Attributes.Security;
using System.Data;
using System.Web;
using Fatec.ControleEstoque.Attributes.Templates;

namespace Fatec.ControleEstoque.Data.Model
{
    [Security(Role = "Pedidos", Action = "All")]
    [MetadataType(typeof(PedidosMetadata))]
    public partial class Pedidos : IValidatable
    {
        public class PedidosMetadata
        {
            [DisplayName("Código")]
            [ReadOnly(true)]
            [HideColumnIn(PageTemplate.Insert)]
            public object Id { get; set; }
            
            [ReadOnly(true)]
            [HideColumnIn(PageTemplate.Insert,PageTemplate.Edit,PageTemplate.List,PageTemplate.Details)]
            public object Total { get; set; }

            [DisplayName("Status")]
            [ReadOnly(true)]
            [HideColumnIn(PageTemplate.Insert,PageTemplate.Edit)]
            public object Status_Pedido { get; set; }

            [DisplayName("Tipo")]
            public object Tipo_Pedido { get; set; }

            [DisplayName("Data de Pedido")]
            [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
            public object Dt_Pedido { get; set; }

            [DisplayName("Data de Status")]
            [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")]
            [UIHint("DateTime")]
            [HideColumnIn(PageTemplate.Edit,PageTemplate.Insert)]
            public object Dt_Status { get; set; }

            [DisplayName("Usuário de Cadastro")]
            [HideColumnIn(PageTemplate.Edit,PageTemplate.Insert)]
            public object Usuarios { get; set; }

            [DisplayName("Terceiro")]
            public object Terceiros { get; set; }

            [UIHint("ChildrenGrid")]
            [HideColumnIn(PageTemplate.List,PageTemplate.Insert)]
            [DisplayName("Itens Pedido")]
            [ShowColumns( "Produtos"
                        , "Qtde"
                        , "Valor"
                        , EnableDelete = true
                        , EnableInsert = true
                        , EnableUpdate = true
                        )]
            public object Pedido_Produtos
            {
                get;
                set;
            }
        }

            #region IValidatable Members

            public bool Validate(EntityState state)
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    if (state == EntityState.Added)
                    {
                        Total = 0;
                        if (Dt_Status == null || Dt_Status == DateTime.MinValue) Dt_Status = DateTime.Today;
                        if (Dt_Pedido == null || Dt_Pedido == DateTime.MinValue) Dt_Pedido = DateTime.Today;
                        if (Usuarios == null) UsuariosReference.EntityKey = EstoqueEntities.Context.Usuarios.Where(p => p.User.Equals(HttpContext.Current.User.Identity.Name)).First().EntityKey;
                        if (Status_Pedido == null) Status_PedidoReference.EntityKey = EstoqueEntities.Context.Status_Pedido.Where(p => p.Id.Equals("A")).First().EntityKey;
                    }
                    else
                    {
                        string statusPedido = (string)EstoqueEntities.Context.Pedidos.Where(p => p.Id == this.Id).FirstOrDefault().Status_PedidoReference.EntityKey.EntityKeyValues[0].Value;
                        if (statusPedido == "C")
                        {
                            ExceptionMessage = "Um pedido cancelado não pode ser alterado!";
                        }
                        else if (statusPedido == "F")
                        {
                            ExceptionMessage = "Um pedido finalizado não pode ser alterado!";
                        }
                    }
                }
                else
                {
                    HttpContext.Current.Response.Redirect("Login.aspx");
                }
                

                return string.IsNullOrEmpty(ExceptionMessage);
            }

            public string ExceptionMessage { get; set; }

            #endregion
        }
    }

